package com.alibaba.polardbx.qatest.ddl.auto.partition;

import org.junit.Test;
import org.junit.runners.Parameterized;

import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;

/**
 * @author chenghui.lch
 */

public class PartitionColumnTypeForKey4Test extends PartitionColumnTypePrepStmtTestBase {

    public TestParameter parameter;

    public PartitionColumnTypeForKey4Test(TestParameter parameter) {
        super(parameter);
        this.testDbName = this.testDbName + "_k4";
        this.testQueryByPrepStmt = false;
        this.testInsertByPrepStmt = false;
        this.testDbName = this.testDbName + "_k4";
    }

    @Parameterized.Parameters(name = "{index}: partColTypeTestCase {0}")
    public static List<TestParameter> parameters() {
        // partition strategy: range/list/hash/range column/list column/key
        // data type: numeric/string/time
        return Arrays.asList(

            /**
             * ========= Key, int -> varchar ===========
             */
            new TestParameter(
                "key_varchar63",
                new String[] {"c1"}/*col*/,
                new String[] {"varchar(63) default null "}/*data types*/,
                new String[] {"set sql_mode='';set names utf8;", "", ""}/*prepStmts*/,
                "key"/*strategy*/,
                new String[] {"16"}/*bndVal*/,
                new String[] {
                    "(0)",
                    "(null)",
                    "(-9223372036854775808)",
                    "(9223372036854775807)",
                    "(-9223372036854775807)",
                    "(922337203685477580)",
                    "(922337203685477579)",
                    "(-9223372036854775808)",
                    "(-9223372036854775803)",
                    "(-2147483653)",
                    "(-2147483648)",
                    "(-2147483643)",
                    "(-8388613)",
                    "(-8388608)",
                    "(-8388603)",
                    "(-32773)",
                    "(-32768)",
                    "(-32763)",
                    "(-133)",
                    "(-128)",
                    "(-123)",
                    "(-5)",
                    "(0)",
                    "(5)",
                    "(122)",
                    "(127)",
                    "(132)",
                    "(255)",
                    "(32762)",
                    "(32767)",
                    "(32772)",
                    "(65530)",
                    "(65535)",
                    "(65540)",
                    "(8388602)",
                    "(8388607)",
                    "(8388612)",
                    "(16777210)",
                    "(16777215)",
                    "(16777220)",
                    "(2147483642)",
                    "(2147483647)",
                    "(2147483652)",
                    "(4294967290)",
                    "(4294967295)",
                    "(4294967300)",
                    "(9223372036854775802)",
                    "(9223372036854775807)",
                    "(9223372036854775812)",
                    "(18446744073709551610)",
                    "(18446744073709551615)",
                }/*insertValues*/
                ,
                new String[] {
                    "('-9223372036854775808')",
                    "('-9223372036854775807')",
                    "('-922337203685477580')",
                    "('-922337203685477579')",
                    "('-9223372036854775803')",
                    "('-2147483653')",
                    "('-2147483648')",
                    "('-2147483643')",
                    "('-8388613')",
                    "('-8388608')",
                    "('-8388603')",
                    "('-32773')",
                    "('-32768')",
                    "('-32763')",
                    "('-133')",
                    "('-128')",
                    "('-123')",
                    "('-5')",
                    "('0')",
                    "('5')",
                    "('122')",
                    "('127')",
                    "('132')",
                    "('255')",
                    "('32762')",
                    "('32767')",
                    "('32772')",
                    "('65530')",
                    "('65535')",
                    "('65540')",
                    "('8388602')",
                    "('8388607')",
                    "('8388612')",
                    "('16777210')",
                    "('16777215')",
                    "('16777220')",
                    "('2147483642')",
                    "('2147483647')",
                    "('2147483652')",
                    "('4294967290')",
                    "('4294967295')",
                    "('4294967300')",
                    "('9223372036854775802')",
                    "('9223372036854775807')",
                    "('9223372036854775812')",
                    "('18446744073709551610')",
                    "('18446744073709551615')"
                }/*selectValues*/
                ,
                new String[] {
                    "('-9223372036854775808')",
                    "('-9223372036854775807')",
                    "('-9223372036854775803')",
                    "('-2147483653')",
                    "('-2147483648')",
                    "('-2147483643')",
                    "('-8388613')",
                    "('-8388608')",
                    "('-8388603')",
                    "('-32773')",
                    "('-32768')",
                    "('-32763')",
                    "('-133')",
                    "('-128')",
                    "('-123')",
                    "('-5')",
                    "('0')",
                    "('5')",
                    "('122')",
                    "('127')",
                    "('132')",
                    "('255')",
                    "('32762')",
                    "('32767')",
                    "('32772')",
                    "('65530')",
                    "('65535')",
                    "('65540')",
                    "('8388602')",
                    "('8388607')",
                    "('8388612')",
                    "('16777210')",
                    "('16777215')",
                    "('16777220')",
                    "('2147483642')",
                    "('2147483647')",
                    "('2147483652')",
                    "('4294967290')",
                    "('4294967295')",
                    "('4294967300')",
                    "('9223372036854775802')",
                    "('9223372036854775807')",
                    "('9223372036854775812')",
                    "('18446744073709551610')",
                    "('18446744073709551615')"
                }/*rngSortValues*/
            )
            ,
            /**
             * ========= Key, int -> varchar2 ===========
             */
            new TestParameter(
                "key_varchar63_2",
                new String[] {"c1"}/*col*/,
                new String[] {"varchar(63) default null "}/*data types*/,
                new String[] {"set sql_mode='';set names utf8;", "", ""}/*prepStmts*/,
                "key"/*strategy*/,
                new String[] {"16"}/*bndVal*/,
                new String[] {
                    "('0')",
                    "(null)",
                    "('-9223372036854775808')",
                    "('9223372036854775807')",
                    "('-9223372036854775807')",
                    "('922337203685477580')",
                    "('922337203685477579')",
                    "('-9223372036854775808')",
                    "('-9223372036854775803')",
                    "('-2147483653')",
                    "('-2147483648')",
                    "('-2147483643')",
                    "('-8388613')",
                    "('-8388608')",
                    "('-8388603')",
                    "('-32773')",
                    "('-32768')",
                    "('-32763')",
                    "('-133')",
                    "('-128')",
                    "('-123')",
                    "('-5')",
                    "('0')",
                    "('5')",
                    "('122')",
                    "('127')",
                    "('132')",
                    "('255')",
                    "('32762')",
                    "('32767')",
                    "('32772')",
                    "('65530')",
                    "('65535')",
                    "('65540')",
                    "('8388602')",
                    "('8388607')",
                    "('8388612')",
                    "('16777210')",
                    "('16777215')",
                    "('16777220')",
                    "('2147483642')",
                    "('2147483647')",
                    "('2147483652')",
                    "('4294967290')",
                    "('4294967295')",
                    "('4294967300')",
                    "('9223372036854775802')",
                    "('9223372036854775807')",
                    "('9223372036854775812')",
                    "('18446744073709551610')",
                    "('18446744073709551615')"
                }/*insertValues*/
                ,

                new String[] {
                    /**
                     * the compare datatype of bigint (unsigned) and varchar are not compatible to mysql,
                     * so ingore
                    */
//                    "(-9223372036854775808)",
//                    "(-9223372036854775807)",
//                    "(-9223372036854775803)",
                    "(-2147483653)",
                    "(-2147483648)",
                    "(-2147483643)",
                    "(-8388613)",
                    "(-8388608)",
                    "(-8388603)",
                    "(-32773)",
                    "(-32768)",
                    "(-32763)",
                    "(-133)",
                    "(-128)",
                    "(-123)",
                    "(-5)",
                    "(0)",
                    "(5)",
                    "(122)",
                    "(127)",
                    "(132)",
                    "(255)",
                    "(32762)",
                    "(32767)",
                    "(32772)",
                    "(65530)",
                    "(65535)",
                    "(65540)",
                    "(8388602)",
                    "(8388607)",
                    "(8388612)",
                    "(16777210)",
                    "(16777215)",
                    "(16777220)",
                    "(2147483642)",
                    "(2147483647)",
                    "(2147483652)",
                    "(4294967290)",
                    "(4294967295)",
                    "(4294967300)",

                    /**
                     * the compare datatype of bigint (unsigned) and varchar are not compatible to mysql,
                     * so ignore
                    */
//                    "(9223372036854775802)",
//                    "(9223372036854775807)",
//                    "(9223372036854775812)",
//                    "(18446744073709551610)",
//                    "(18446744073709551615)"
                }/*selectValues*/
                ,
                new String[] {
                    "('18446744073709551610')",
                    "('18446744073709551615')"
                }/*rngSortValues*/
            )
            ,

            /**
             * ========= Key, int -> varchar3 ===========
             */
            new TestParameter(
                "key_varchar8_1",
                new String[] {"c1"}/*col*/,
                new String[] {"varchar(8) default null "}/*data types*/,
                new String[] {"set sql_mode='';set names utf8;", "", ""}/*prepStmts*/,
                "key"/*strategy*/,
                new String[] {"16"}/*bndVal*/,
                new String[] {
                    "('0')",
                    "(null)",
                    "('-9223372036854775808')",
                    "('9223372036854775807')",
                    "('-9223372036854775807')",
                    "('922337203685477580')",
                    "('922337203685477579')",
                    "('-9223372036854775808')",
                    "('-9223372036854775803')",
                    "('-2147483653')",
                    "('-2147483648')",
                    "('-2147483643')",
                    "('-8388613')",
                    "('-8388608')",
                    "('-8388603')",
                    "('-32773')",
                    "('-32768')",
                    "('-32763')",
                    "('-133')",
                    "('-128')",
                    "('-123')",
                    "('-5')",
                    "('0')",
                    "('5')",
                    "('122')",
                    "('127')",
                    "('132')",
                    "('255')",
                    "('32762')",
                    "('32767')",
                    "('32772')",
                    "('65530')",
                    "('65535')",
                    "('65540')",
                    "('8388602')",
                    "('8388607')",
                    "('8388612')",
                    "('16777210')",
                    "('16777215')",
                    "('16777220')",
                    "('2147483642')",
                    "('2147483647')",
                    "('2147483652')",
                    "('4294967290')",
                    "('4294967295')",
                    "('4294967300')",
                    "('9223372036854775802')",
                    "('9223372036854775807')",

                    /**
                     * the following values of the compare datatype of bigint are overload, so it compare result are not compatible to mysql,
                     * so ignore
                    */
//
//                    "('9223372036854775812')",
//                    "('18446744073709551610')",
//                    "('18446744073709551615')"
                }/*insertValues*/
                ,

                new String[] {
                    "('0')",
                    "(null)",
                    "('-9223372036854775808')",
                    "('9223372036854775807')",
                    "('-9223372036854775807')",
                    "('922337203685477580')",
                    "('922337203685477579')",
                    "('-9223372036854775808')",
                    "('-9223372036854775803')",
                    "('-2147483653')",
                    "('-2147483648')",
                    "('-2147483643')",
                    "('-2147483')",
                    "('-8388613')",
                    "('-8388608')",
                    "('-8388603')",
                    "('-32773')",
                    "('-32768')",
                    "('-32763')",
                    "('-133')",
                    "('-128')",
                    "('-123')",
                    "('-5')",
                    "('0')",
                    "('5')",
                    "('122')",
                    "('127')",
                    "('132')",
                    "('255')",
                    "('32762')",
                    "('32767')",
                    "('32772')",
                    "('65530')",
                    "('65535')",
                    "('65540')",
                    "('8388602')",
                    "('8388607')",
                    "('8388612')",
                    "('16777210')",
                    "('16777215')",
                    "('16777220')",
                    "('21474836')",
                    "('2147483642')",
                    "('2147483647')",
                    "('2147483652')",
                    "('4294967290')",
                    "('4294967295')",
                    "('4294967300')",
                    "('9223372036854775802')",
                    "('9223372036854775807')",
//                    "('9223372036854775812')",
//                    "('18446744073709551610')",
//                    "('18446744073709551615')"
                }/*selectValues*/
                ,
                new String[] {
                    "('100')",
                    "('10000')"
                }/*rngSortValues*/
            )
            ,

            /**
             * ========= Key, int -> datetime ===========
             */
            // There are some bugs of mysql during int value to datetime, so ignore this case
            /**
             * e.g
             *  insert into key_datetime0 values (122,127);
             *  "select c1 from key_datetime0 where   ((c1) in  (2, 122,127)) order by c1": result is empty
             *  "select c1 from key_datetime0 where   ((c1) in  (122,127)) order by c1": result are 2 rows;
             *
             */
//            new TestParameter(
//                "key_datetime0",
//                new String[] {"c1"}/*col*/,
//                new String[] {"datetime default null "}/*data types*/,
//                new String[] {"set sql_mode='';set names utf8;", "", ""}/*prepStmts*/,
//                "key"/*strategy*/,
//                new String[] {"16"}/*bndVal*/,
//                new String[] {
//                    "(0)",
//                    "(null)",
//                    "(-9223372036854775808)",
//                    "(9223372036854775807)",
//                    "(-9223372036854775807)",
//                    "(922337203685477580)",
//                    "(922337203685477579)",
//                    "(-9223372036854775808)",
//                    "(-9223372036854775803)",
//                    "(-2147483653)",
//                    "(-2147483648)",
//                    "(-2147483643)",
//                    "(-8388613)",
//                    "(-8388608)",
//                    "(-8388603)",
//                    "(-32773)",
//                    "(-32768)",
//                    "(-32763)",
//                    "(-133)",
//                    "(-128)",
//                    "(-123)",
//                    "(-5)",
//                    "(0)",
//                    "(5)",
//                    "(122)",
//                    "(127)",
//                    "(132)",
//                    "(255)",
//                    "(32762)",
//                    "(32767)",
//                    "(32772)",
//                    "(65530)",
//                    "(65535)",
//                    "(65540)",
//                    "(8388602)",
//                    "(8388607)",
//                    "(8388612)",
//                    "(16777210)",
//                    "(16777215)",
//                    "(16777220)",
//                    "(2147483642)",
//                    "(2147483647)",
//                    "(2147483652)",
//                    "(4294967290)",
//                    "(4294967295)",
//                    "(4294967300)",
//                    "(9223372036854775802)",
//                    "(9223372036854775807)",
////                    "(9223372036854775812)",
////                    "(18446744073709551610)",
////                    "(18446744073709551615)",
//                }/*insertValues*/
//                ,
//                new String[] {
//                    "(0)",
//                    "(null)",
//                    "(-9223372036854775808)",
//                    "(-9223372036854775807)",
//                    "(-922337203685477580)",
//                    "(-922337203685477579)",
//                    "(-9223372036854775808)",
//                    "(-9223372036854775803)",
//                    "(-2147483653)",
//                    "(-2147483648)",
//                    "(-2147483643)",
//                    "(-8388613)",
//                    "(-8388608)",
//                    "(-8388603)",
//                    "(-32773)",
//                    "(-32768)",
//                    "(-32763)",
//                    "(-133)",
//                    "(-128)",
//                    "(-123)",
//                    "(-5)",
//                    "(0)",
//                    "(5)",
//                    "(122)",
//                    "(127)",
//                    "(132)",
//                    "(255)",
//                    "(32762)",
//                    "(32767)",
//                    "(32772)",
//                    "(65530)",
//                    "(65535)",
//                    "(65540)",
//                    "(8388602)",
//                    "(8388607)",
//                    "(8388612)",
//                    "(16777210)",
//                    "(16777215)",
//                    "(16777220)",
//                    "(2147483642)",
//                    "(2147483647)",
//                    "(2147483652)",
//                    "(4294967290)",
//                    "(4294967295)",
//                    "(4294967300)",
//                    "(9223372036854775802)",
//                    "(9223372036854775807)",
////                    "(9223372036854775812)",
////                    "(18446744073709551610)",
////                    "(18446744073709551615)",
//                }/*selectValues*/
//                ,
//                new String[] {
//                    "(0)",
//                    "(1000)"
//                }/*rngSortValues*/
//            )
//            ,
            /**
             * ========= Key, varchar -> int ===========
             */
            new TestParameter(
                "key_bigint1",
                new String[] {"c1"}/*col*/,
                new String[] {"bigint default null "}/*data types*/,
                new String[] {"set sql_mode='';set names utf8;", "", ""}/*prepStmts*/,
                "key"/*strategy*/,
                new String[] {"16"}/*bndVal*/,
                new String[] {
                    "('0')",
                    "(null)",
                    "('-9223372036854775808')",
                    "('9223372036854775807')",
                    "('-9223372036854775807')",
                    "('922337203685477580')",
                    "('922337203685477579')",
                    "('-9223372036854775808')",
                    "('-9223372036854775803')",
                    "('-2147483653')",
                    "('-2147483648')",
                    "('-2147483643')",
                    "('-8388613')",
                    "('-8388608')",
                    "('-8388603')",
                    "('-32773')",
                    "('-32768')",
                    "('-32763')",
                    "('-133')",
                    "('-128')",
                    "('-123')",
                    "('-5')",
                    "('0')",
                    "('5')",
                    "('122')",
                    "('127')",
                    "('132')",
                    "('255')",
                    "('32762')",
                    "('32767')",
                    "('32772')",
                    "('65530')",
                    "('65535')",
                    "('65540')",
                    "('8388602')",
                    "('8388607')",
                    "('8388612')",
                    "('16777210')",
                    "('16777215')",
                    "('16777220')",
                    "('2147483642')",
                    "('2147483647')",
                    "('2147483652')",
                    "('4294967290')",
                    "('4294967295')",
                    "('4294967300')",
                    "('9223372036854775802')",
                    "('9223372036854775807')",
//                    "('9223372036854775812')",
//                    "('18446744073709551610')",
//                    "('18446744073709551615')"
                }/*insertValues*/
                ,
                new String[] {
                    "(0)",
                    "(null)",
                    "('-9223372036854775808')",
                    "('-9223372036854775807')",
                    "('-922337203685477580')",
                    "('-922337203685477579')",
                    "('-9223372036854775808')",
                    "('-9223372036854775803')",
                    "(-2147483653)",
                    "(-2147483648)",
                    "(-2147483643)",
                    "(-8388613)",
                    "(-8388608)",
                    "(-8388603)",
                    "(-32773)",
                    "(-32768)",
                    "(-32763)",
                    "(-133)",
                    "(-128)",
                    "(-123)",
                    "(-5)",
                    "(0)",
                    "(5)",
                    "(122)",
                    "(127)",
                    "(132)",
                    "(255)",
                    "(32762)",
                    "(32767)",
                    "(32772)",
                    "(65530)",
                    "(65535)",
                    "(65540)",
                    "(8388602)",
                    "(8388607)",
                    "(8388612)",
                    "(16777210)",
                    "(16777215)",
                    "(16777220)",
                    "(2147483642)",
                    "(2147483647)",
                    "(2147483652)",
                    "(4294967290)",
                    "(4294967295)",
                    "(4294967300)",
                    "(9223372036854775802)",
                    "(9223372036854775807)",
//                    "(9223372036854775812)",
//                    "(18446744073709551610)",
//                    "(18446744073709551615)"
                }/*selectValues*/
                ,
                new String[] {
                    "(0)",
                    "(1000)"
                }/*rngSortValues*/
            )
            ,

            /**
             * ========= Key, varchar -> int ===========
             */
            new TestParameter(
                "key_bigint3",
                new String[] {"c1"}/*col*/,
                new String[] {"bigint default null "}/*data types*/,
                new String[] {"set sql_mode='';set names utf8;", "", ""}/*prepStmts*/,
                "key"/*strategy*/,
                new String[] {"16"}/*bndVal*/,
                new String[] {
                    "('0')",
                    "(null)",
                    "('-9223372036854775808')",
                    "('9223372036854775807')",
                    "('-9223372036854775807')",
                    "('922337203685477580')",
                    "('922337203685477579')",
                    "('-9223372036854775808')",
                    "('-9223372036854775803')",
                    "('-2147483653')",
                    "('-2147483648')",
                    "('-2147483643')",
                    "('-8388613')",
                    "('-8388608')",
                    "('-8388603')",
                    "('-32773')",
                    "('-32768')",
                    "('-32763')",
                    "('-133')",
                    "('-128')",
                    "('-123')",
                    "('-5')",
                    "('0')",
                    "('5')",
                    "('122')",
                    "('127')",
                    "('132')",
                    "('255')",
                    "('32762')",
                    "('32767')",
                    "('32772')",
                    "('65530')",
                    "('65535')",
                    "('65540')",
                    "('8388602')",
                    "('8388607')",
                    "('8388612')",
                    "('16777210')",
                    "('16777215')",
                    "('16777220')",
                    "('2147483642')",
                    "('2147483647')",
                    "('2147483652')",
                    "('4294967290')",
                    "('4294967295')",
                    "('4294967300')",
                    "('9223372036854775802')",
                    "('9223372036854775807')",
                    "('9223372036854775812')",
                    "('18446744073709551610')",
                    "('18446744073709551615')"
                }/*insertValues*/
                ,
                new String[] {
                    "(null)",
                    "('-9223372036854775808')",
                    "('-9223372036854775807')",
                    "('-922337203685477580')",
                    "('-922337203685477579')",
                    "('-9223372036854775808')",
                    "('-9223372036854775803')",
                    "('-2147483653')",
                    "('-2147483648')",
                    "('-2147483643')",
                    "('-8388613')",
                    "('-8388608')",
                    "('-8388603')",
                    "('-32773')",
                    "('-32768')",
                    "('-32763')",
                    "('-133')",
                    "('-128')",
                    "('-123')",
                    "('-5')",
                    "('0')",
                    "('5')",
                    "('122')",
                    "('127')",
                    "('132')",
                    "('255')",
                    "('32762')",
                    "('32767')",
                    "('32772')",
                    "('65530')",
                    "('65535')",
                    "('65540')",
                    "('8388602')",
                    "('8388607')",
                    "('8388612')",
                    "('16777210')",
                    "('16777215')",
                    "('16777220')",
                    "('2147483642')",
                    "('2147483647')",
                    "('2147483652')",
                    "('4294967290')",
                    "('4294967295')",
                    "('4294967300')",
                    "('9223372036854775802')",
                    "('9223372036854775807')",
                    "('9223372036854775812')",
                    "('18446744073709551610')",
                    "('18446744073709551615')"
                }/*selectValues*/
                ,
                new String[] {
                    "(0)",
                    "(1000)"
                }/*rngSortValues*/
            )
        );

    }

    @Test
    public void runTest() throws SQLException {
        super.testInsertAndSelect();
    }

}
